package com.sdhs.paas.itims.app;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import com.alibaba.fastjson.TypeReference;
import com.sdhs.paas.itims.bean.ItimsTerminalBean;
import com.sdhs.paas.itims.configuration.Config;
import com.sdhs.paas.itims.dto.DeviceAvailableListDTO;
import com.sdhs.paas.itims.dto.ItimsTerminalDTO;
import com.sdhs.paas.itims.dto.req.ItimsTerminalReqDTO;
import com.sdhs.paas.itims.dto.res.ItimsTerminalResDTO;
import com.sdhs.paas.itims.service.ItimsTerminalService;
import com.sdhs.paas.sdk.base.common.BasePage;
import com.sdhs.paas.sdk.base.dto.PageInfoDTO;
import com.sdhs.paas.sdk.base.page.Page;
import com.sdhs.paas.sdk.base.utils.EntityDtoConvertUtil;
import com.sdhs.paas.sdk.core.PaasBaseRequest;
import com.sdhs.paas.sdk.core.PaasBaseResponse;
import com.sdhs.paas.sdk.core.RefreshableRestController;
import com.sdhs.paas.sdk.core.logger.Logger;
import com.sdhs.paas.sdk.core.logger.LoggerFactory;
import com.sdhs.paas.sdk.core.web.client.PaasRestTemplate;

/**
 * @author ItimsTerminal
 * @version 1.0
 * @Title: 代码生成接口，用于接受前端传输过来的数据
 * @author kangjichang
 * @date 2018-09-18
 */

@RefreshableRestController
@RequestMapping(value = "/itimsTerminal")
public class ItimsTerminalController {
	private static Logger LOGGER = LoggerFactory.getLogger(ItimsPosExchangeController.class);

	@Autowired
	private ItimsTerminalService itimsTerminalService;

	@Autowired
	@Qualifier("externalRestTemplate")
	private PaasRestTemplate externalRestTemplate;

	@Autowired
	Config config;

	/**
	 * 分页查询接口
	 */
	@PostMapping("/getItimsTerminalPageList")
	public PaasBaseResponse<ItimsTerminalResDTO> getItimsTerminalPageList(
			@RequestBody PaasBaseRequest<ItimsTerminalReqDTO> itimsTerminalReqDTO) {
		ItimsTerminalDTO itimsTerminalDTO = itimsTerminalReqDTO.getBody().getItimsTerminalDTO();
		PageInfoDTO pageInfoDTO = itimsTerminalReqDTO.getBody().getPageInfo();

		BasePage pageRequest = new BasePage();
		pageRequest.setPage(pageInfoDTO.getPage());
		pageRequest.setCount(pageInfoDTO.getPageSize());
		ItimsTerminalBean itimsTerminalBean = EntityDtoConvertUtil.convertToEntity(itimsTerminalDTO,
				ItimsTerminalBean.class);
		Page<ItimsTerminalBean> page = null;
		Integer online = itimsTerminalBean.getOnline();
		if(online != null && 0 == online){
			Set<String> setList = this.getEqAvailableList();
			itimsTerminalBean.setEqIds(new ArrayList(setList));
			page = itimsTerminalService.getPageItimsTerminalList(pageRequest, itimsTerminalBean);
		}else if(online != null && 1== online){
			Set<String> setList = this.getEqAvailableList();
			itimsTerminalBean.setEqIds(new ArrayList(setList));
			page = itimsTerminalService.getPageItimsTerminalList(pageRequest, itimsTerminalBean);
		}else{
			page = itimsTerminalService.getPageItimsTerminalList(pageRequest, itimsTerminalBean);
		}
		PageInfoDTO resPageInfoDTO = new PageInfoDTO();
		ItimsTerminalResDTO itimsTerminalResDTO = new ItimsTerminalResDTO();
		resPageInfoDTO.setPage(page.getCurPage());
		resPageInfoDTO.setPageSize(page.getPageSize());
		resPageInfoDTO.setPageCount(page.getPageCount());
		resPageInfoDTO.setRowCount(page.getTotalCount());
		itimsTerminalResDTO.setPageInfo(resPageInfoDTO);
		List<ItimsTerminalBean> ucAppBeanList = page.getResult();
		ucAppBeanList = this.dealPosOnlineStatus(ucAppBeanList);
		List<ItimsTerminalDTO> dtoList = new ArrayList<ItimsTerminalDTO>();
		dtoList = EntityDtoConvertUtil.convertToDTOList(ucAppBeanList, new TypeReference<List<ItimsTerminalDTO>>() {
		});
		itimsTerminalResDTO.setItimsTerminalDTOList(dtoList);
		return new PaasBaseResponse<>(itimsTerminalResDTO);
	}

	/**
	 * 根据组id查询，终端详情信息
	 */
	@PostMapping("/getItimsTerminalListByGroupId")
	public PaasBaseResponse<ItimsTerminalResDTO> getItimsTerminalListByGroupId(
			@RequestBody PaasBaseRequest<ItimsTerminalReqDTO> itimsTerminalReqDTO) {
		ItimsTerminalDTO itimsTerminalDTO = itimsTerminalReqDTO.getBody().getItimsTerminalDTO();
		String groupId = itimsTerminalDTO.getId();
		List<ItimsTerminalBean> list = itimsTerminalService.getItimsTerminalListByGroupId(groupId);
		List<ItimsTerminalDTO> dtoList = new ArrayList<ItimsTerminalDTO>();
		dtoList = EntityDtoConvertUtil.convertToDTOList(list, new TypeReference<List<ItimsTerminalDTO>>() {
		});
		ItimsTerminalResDTO itimsTerminalResDTO = new ItimsTerminalResDTO();
		itimsTerminalResDTO.setItimsTerminalDTOList(dtoList);
		return new PaasBaseResponse<>(itimsTerminalResDTO);
	}

	/**
	 * 保存接口
	 */
	@PostMapping("/saveItimsTerminal")
	public PaasBaseResponse<ItimsTerminalResDTO> saveItimsTerminal(
			@RequestBody PaasBaseRequest<ItimsTerminalReqDTO> itimsTerminalReqDTO) {
		ItimsTerminalDTO itimsTerminalDTO = itimsTerminalReqDTO.getBody().getItimsTerminalDTO();
		ItimsTerminalBean itimsTerminalBean = EntityDtoConvertUtil.convertToEntity(itimsTerminalDTO,
				ItimsTerminalBean.class);
		String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
		itimsTerminalBean.setId(uuid);
		itimsTerminalBean.setIsDeleted(0);
		Boolean flag = itimsTerminalService.saveItimsTerminal(itimsTerminalBean);
		itimsTerminalDTO.setId(uuid);
		ItimsTerminalResDTO itimsTerminalResDTO = new ItimsTerminalResDTO();
		itimsTerminalResDTO.setItimsTerminalDTO(itimsTerminalDTO);
		return new PaasBaseResponse<>(itimsTerminalResDTO);
	}

	/**
	 * 修改接口
	 */
	@PostMapping("/updateItimsTerminal")
	public PaasBaseResponse<ItimsTerminalResDTO> updateItimsTerminal(
			@RequestBody PaasBaseRequest<ItimsTerminalReqDTO> itimsTerminalReqDTO) {
		ItimsTerminalDTO itimsTerminalDTO = itimsTerminalReqDTO.getBody().getItimsTerminalDTO();
		ItimsTerminalBean itimsTerminalBean = EntityDtoConvertUtil.convertToEntity(itimsTerminalDTO,
				ItimsTerminalBean.class);
		Boolean flag = itimsTerminalService.updateItimsTerminal(itimsTerminalBean);
		ItimsTerminalResDTO itimsTerminalResDTO = new ItimsTerminalResDTO();
		itimsTerminalResDTO.setItimsTerminalDTO(itimsTerminalDTO);
		return new PaasBaseResponse<>(itimsTerminalResDTO);
	}

	/**
	 * 获取详情接口
	 */
	@PostMapping("/getItimsTerminalDetail")
	public PaasBaseResponse<ItimsTerminalResDTO> getItimsTerminalDetail(
			@RequestBody PaasBaseRequest<ItimsTerminalReqDTO> itimsTerminalReqDTO) {
		ItimsTerminalDTO itimsTerminalDTO = itimsTerminalReqDTO.getBody().getItimsTerminalDTO();
		ItimsTerminalBean itimsTerminalBean = EntityDtoConvertUtil.convertToEntity(itimsTerminalDTO,
				ItimsTerminalBean.class);
		itimsTerminalBean = itimsTerminalService.getItimsTerminalDetail(itimsTerminalBean.getId());
		itimsTerminalDTO = EntityDtoConvertUtil.convertToDTO(itimsTerminalBean, ItimsTerminalDTO.class);
		ItimsTerminalResDTO itimsTerminalResDTO = new ItimsTerminalResDTO();
		itimsTerminalResDTO.setItimsTerminalDTO(itimsTerminalDTO);
		return new PaasBaseResponse<>(itimsTerminalResDTO);
	}

	/**
	 * 删除接口
	 */
	@PostMapping("/deleteItimsTerminal")
	public PaasBaseResponse<ItimsTerminalResDTO> deleteItimsTerminal(
			@RequestBody PaasBaseRequest<ItimsTerminalReqDTO> itimsTerminalReqDTO) {
		ItimsTerminalDTO itimsTerminalDTO = itimsTerminalReqDTO.getBody().getItimsTerminalDTO();
		ItimsTerminalBean itimsTerminalBean = EntityDtoConvertUtil.convertToEntity(itimsTerminalDTO,
				ItimsTerminalBean.class);
		Boolean flag = itimsTerminalService.deleteItimsTerminal(itimsTerminalBean);
		ItimsTerminalResDTO itimsTerminalResDTO = new ItimsTerminalResDTO();
		return new PaasBaseResponse<>(itimsTerminalResDTO);
	}

	private List<ItimsTerminalBean> dealPosOnlineStatus(List<ItimsTerminalBean> ucAppBeanList) {
		DeviceAvailableListDTO deviceAvailableListDTO = new DeviceAvailableListDTO();
		try {
			// 在线列表
			deviceAvailableListDTO = externalRestTemplate
					.getForObject(config.nettyServerUrl + "/api/pos/available/list", DeviceAvailableListDTO.class);
		} catch (Exception e) {
			deviceAvailableListDTO = new DeviceAvailableListDTO();
			Set<String> setList = new HashSet<String>();
			deviceAvailableListDTO.setDevice_id(setList);
		}
		Set<String> setList = deviceAvailableListDTO.getDevice_id();
		if (setList == null) {
			setList = new HashSet<String>();
		}
		for (ItimsTerminalBean itimsTerminalBean : ucAppBeanList) {
			if (setList.contains(itimsTerminalBean.getEquipmentId())) {
				itimsTerminalBean.setOnline(1);
			} else {
				itimsTerminalBean.setOnline(0);
			}
		}
		return ucAppBeanList;
	}

	// 获取在线列表
	private Set<String> getEqAvailableList() {
		Set<String> setList = new HashSet<String>();
		DeviceAvailableListDTO deviceAvailableListDTO = new DeviceAvailableListDTO();
		try {
			// 在线列表
			deviceAvailableListDTO = externalRestTemplate
					.getForObject(config.nettyServerUrl + "/api/pos/available/list", DeviceAvailableListDTO.class);
		} catch (Exception e) {
			LOGGER.info("请求获取在线列表失败！"+config.nettyServerUrl + "/api/pos/available/list");
			deviceAvailableListDTO = new DeviceAvailableListDTO();
			setList = new HashSet<String>();
			deviceAvailableListDTO.setDevice_id(setList);
			return setList;
		}
		setList = deviceAvailableListDTO.getDevice_id();
		if (setList == null) {
			setList = new HashSet<String>();
		}
		LOGGER.info("请求获取的在线终端数量："+setList.size());
		return setList;
	}

}
